package java_test.io_test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/*
 *  使用IO流,实现对象Person的序列化 和 反序列化
 *        1. ObjectOutputStream(对象输出流)  写对象，实现序列化
 *                构造方法：ObjectOutputStream(OutputStream out)  传递任意的字节输出流
 *                写出对象的方法： void writeObject(Object o)
 *        2. ObjectInputStream(对象输入流)   读对象，实现反序列化
 *                构造方法：ObjectInputStream(InputStream in)    传递任意字节的输入流
 *                读取对象的方法： Object readObject()
 *
 *  序列化Person成功后，在E盘生成一个.properties文件， 反序列化Person是读取.properties文件后生成一个Person对象
 */
public class ObjectStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        objectOutputStreamTest();
        objectInputStreamTest();
    }

    public static void objectOutputStreamTest() throws IOException {
        // 1.创建字节输出流对象，封装文件
        FileOutputStream fos = new FileOutputStream("xuliehua.properties");
        // 2.创建写出对象的序列化流的对象
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Person per = new Person("法外狂徒 张三", 18);
        // 3.调用序列化流的方法writeObject, 写出对象
        oos.writeObject(per);
        // 4.关闭流操作
        oos.close();
        System.out.println(per.toString());
    }

    public static void objectInputStreamTest() throws IOException, ClassNotFoundException {
        // 1.创建字节输入流对象
        FileInputStream fis = new FileInputStream("xuliehua.properties");
        // 2.创建反序列化流，构造方法中传递，字节输入流
        ObjectInputStream ois = new ObjectInputStream(fis);
        // 3.调用方法readObject()读取对象
        Object obj = ois.readObject();
        System.out.println(obj);
        // 4.关闭流操作
        ois.close();
    }
}